//package com.dingxi.springbootinit.mq;
//
//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
//import com.rabbitmq.client.AMQP;
//import com.rabbitmq.client.Channel;
//import com.dingxi.springbootinit.api.DeepSeekAiApi;
//import com.dingxi.springbootinit.common.ErrorCode;
//import com.dingxi.springbootinit.exception.BusinessException;
//import com.dingxi.springbootinit.model.entity.Chart;
//import com.dingxi.springbootinit.service.ChartService;
//import com.dingxi.springbootinit.service.UserService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.amqp.support.AmqpHeaders;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.messaging.handler.annotation.Header;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//
//
//@Slf4j
//@Component
//public class MyMessageConsumer {
//
//    @Resource
//    private RabbitTemplate rabbitTemplate;
//
//    @Autowired
//    private UserService userService;
//
//    @Autowired
//    private DeepSeekAiApi ai;
//
//    @Autowired
//    private ChartService chartService;
//
//
//    @RabbitListener(queues = {BiMqConstant.BI_QUEUE_NAME},ackMode = "MANUAL")
//    public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliverTag) throws IOException {
//
//        if(StringUtils.isBlank(message)){
//            channel.basicNack(deliverTag,false,false);
//            throw new BusinessException(ErrorCode.SYSTEM_ERROR);
//        }
//        long chartId = Long.parseLong(message);
//        Chart chart = chartService.getById(chartId);
//        if(chart == null){
//            channel.basicNack(deliverTag,false,false);
//            throw new BusinessException(ErrorCode.SYSTEM_ERROR);
//        }
//        log.info("receiveMessage message={}" ,message);
//        Chart updateChart = new Chart();
//        updateChart.setStatus("running");
//        updateChart.setId(chart.getId());
//        boolean b = chartService.updateById(updateChart);
//        if (!b) {
//            channel.basicNack(deliverTag,false,false);
//            handleChartUpdateError(chart.getId(), "图表执行中状态失败");
//            return;
//        }
//
//        String chat = ai.chat(buildUserInput(chart));
//        String[] split = chat.split("【【【");
//        if (split.length < 3) {
//            channel.basicNack(deliverTag,false,false);
//            handleChartUpdateError(chart.getId(), "AI生成错误");
//            return;
//        }
//        String genChart = split[1];
//        String genResult = split[2];
//
//        Chart updateChartResult = new Chart();
//        updateChartResult.setStatus("succeed");
//        updateChartResult.setId(chart.getId());
//        updateChartResult.setGenChart(genChart);
//        updateChartResult.setGenResult(genResult);
//
//        boolean b1 = chartService.updateById(updateChartResult);
//        if (!b1) {
//            handleChartUpdateError(chart.getId(), "更新图表成功状态失败");
//            return;
//        }
//        try {
//            channel.basicAck(deliverTag,false);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        channel.basicAck(deliverTag,false);
//    }
//
//    private String buildUserInput(Chart chart){
//
//        String chartType = chart.getChartType();
//        String goal = chart.getGoal();
//        String csvData = chart.getChartData();
//        String name = chart.getName();
//        StringBuilder stringBuilder = new StringBuilder();
//
//        final String prompt = "你是一个数据分析师和前端开发专家，接下来我会按照以下固定格式给你提供内容：\n" +
//                "分析需求：\n" +
//                "{数据的需求或目标}\n" +
//                "原始数据：\n" +
//                "{csv格式的原始数据，用,作为分隔符}\n" +
//                "请根据这两部分内容，按照以下指定格式生成内同(此外不要输出任何多余的开头、结尾、注释)\n" +
//                "【【【\n" +
//                "{前端Echarts V5 的 option 配置对象json代码，合理将数据进行可视化。不要生成任何多余的内容，比如注释}\n" +
//                "【【【\n" +
//                "{明确的数据分析结论、越详细越好,不要生成多余的注释}";
//
//        stringBuilder.append(prompt).append("\n");
//        stringBuilder.append("分析目标：").append(goal);
//        if (StringUtils.isNotBlank(chartType)) {
//            stringBuilder.append("。请使用").append(chartType).append("图表类型").append("\n");
//        }
//        if (StringUtils.isNotBlank(name)) {
//            stringBuilder.append("图标名称为：").append(name).append("\n");
//        }
//        String result = stringBuilder.append("数据：").append("\n")
//                .append(csvData).toString();
//        return result;
//
//    }
//
//    private void handleChartUpdateError(long chartId, String execMessage) {
//        Chart chart = new Chart();
//        chart.setStatus("failed");
//        chart.setId(chartId);
//        chart.setExecMessage(execMessage);
//        boolean b = chartService.updateById(chart);
//        if (!b) {
//            log.error("图表更新状态失败" + chartId + "," + execMessage);
//        }
//
//    }
//
//
//
//}
